00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #ifndef DE_FILESYSTEM_PRIV_HPP
00033 #define DE_FILESYSTEM_PRIV_HPP
00034
00035 #ifdef _WIN32
00036 #include <windows.h>
00037 #elif linux
00038 #include <dirent.h>
00039 #endif
00040
00041 #include "deFileSystem.hpp"
00042
00043 class deFileSystem;
00044 class deFSReal;
00045 class deFSVirtual;
00046
00047
00048 class deFileSystem : virtual public IdeFileSystem, public deRefCountBase
00049 {
00050 protected:
00051 deFileSystem();
00052 virtual ~deFileSystem();
00053 public:
00054
00055 void* GetInterface(IdeFileSystem::interface_t i);
00056
00057 virtual IdeFile* Open(const char *Filename, long OpenFlags);
00058
00059
00060 virtual const char *GetDirectory();
00061 virtual deBoolean SetDirectory(const char *Directory);
00062
00063
00064 virtual deBoolean Rename(const char *OldFilename, const char *NewFilename);
00065 virtual deBoolean Delete(const char *Filename, deFSPROGRESS StatusCallback);
00066 virtual deBoolean Move(const char *OldFilename, const char *NewFilename, deFSPROGRESS StatusCallback);
00067 virtual deBoolean Copy(const char *OldFilename, const char *NewFilename, deFSPROGRESS StatusCallback);
00068
00069
00070 virtual deBoolean AddDirectory(const char *Directory);
00071 virtual deBoolean DeleteDirectory(const char *Directory, deFSPROGRESS StatusCallback);
00072
00073
00074 void* FindFirst(const char *Pattern, deFileProperties *Properties);
00075 deBoolean FindNext(void* Handle, deFileProperties *Properties);
00076 deBoolean FindEnd(void* Handle);
00077 };
00078
00079
00080 class deFSReal : public deFileSystem, public IdeFSReal
00081 {
00082 protected:
00083
00084 friend class deFileReal;
00085
00086
00087 deBoolean deFSReal::Open(deFileReal *RealFile, const char *Filename, long OpenFlags);
00088
00089 public:
00090 deFSReal();
00091 ~deFSReal();
00092
00093 void* GetInterface(IdeFileSystem::interface_t i);
00094
00095 IdeFile* Open(const char *Filename, long OpenFlags);
00096
00097
00098 const char *GetDirectory();
00099 deBoolean SetDirectory(const char *Directory);
00100
00101
00102 deBoolean Rename(const char *OldFilename, const char *NewFilename);
00103 deBoolean Delete(const char *Filename, deFSPROGRESS StatusCallback);
00104 deBoolean Move(const char *OldFilename, const char *NewFilename, deFSPROGRESS StatusCallback);
00105 deBoolean Copy(const char *OldFilename, const char *NewFilename, deFSPROGRESS StatusCallback);
00106
00107
00108 deBoolean AddDirectory(const char *Directory);
00109 deBoolean DeleteDirectory(const char *Directory, deFSPROGRESS StatusCallback);
00110
00111
00112 void* FindFirst(const char *Pattern, deFileProperties *Properties);
00113 deBoolean FindNext(void* Handle, deFileProperties *Properties);
00114 deBoolean FindEnd(void* Handle);
00115
00116 private:
00117 char priv_CurrentDirectory[1024];
00118 char priv_TempCurrentDirectory[1024];
00119
00120 #define RealFindID 0x44494652 //'RFID', id for search handles
00121
00122 typedef struct FindInfoReal
00123 {
00124 DWORD FindID;
00125 #ifdef WIN32
00126 HANDLE FindHandle;
00127 WIN32_FIND_DATA FindData;
00128
00129 #elif linux
00130 DIR * FindDir;
00131 char * Pattern;
00132 #else
00133 #error FindData not implemented for OS
00134 #endif
00135 } FindInfoReal;
00136 };
00137
00138
00139 class deFSVirtual : public deFileSystem, public IdeFSVirtual
00140 {
00141 public:
00142 deFSVirtual();
00143 ~deFSVirtual();
00144
00145 void* GetInterface(IdeFileSystem::interface_t i);
00146
00147
00148 deBoolean OpenBaseFile(IdeFile *BaseFile, long OpenFlags);
00149 deBoolean OpenBaseFilename(const char *Filename, long OpenFlags);
00150 deBoolean CloseBaseFile();
00151
00152
00153 IdeFile* Open(const char *Filename, long OpenFlags);
00154
00155
00156 const char *GetDirectory();
00157 deBoolean SetDirectory(const char *Directory);
00158
00159
00160 deBoolean Rename(const char *OldFilename, const char *NewFilename);
00161 deBoolean Delete(const char *Filename, deFSPROGRESS StatusCallback);
00162 deBoolean Move(const char *OldFilename, const char *NewFilename, deFSPROGRESS StatusCallback);
00163 deBoolean Copy(const char *OldFilename, const char *NewFilename, deFSPROGRESS StatusCallback);
00164
00165
00166 deBoolean AddDirectory(const char *Directory);
00167 deBoolean DeleteDirectory(const char *Directory, deFSPROGRESS StatusCallback);
00168
00169
00170 void* FindFirst(const char *Pattern, deFileProperties *Properties);
00171 deBoolean FindNext(void* Handle, deFileProperties *Properties);
00172 deBoolean FindEnd(void* Handle);
00173
00174 protected:
00175 friend class deFileVirtual;
00176
00177
00178 #pragma pack(push,4) //Because of how the file is read, we need 4 byte packing instead of 8
00179 typedef struct VirtualFileEntry
00180 {
00181 char * FileName;
00182 union
00183 {
00184 long Position;
00185 struct VirtualFileEntry * NextDirectory;
00186 };
00187 union
00188 {
00189 long Size;
00190 struct VirtualFileEntry * SubDirectory;
00191
00192 };
00193 s64 Time;
00194 struct VirtualFileEntry * NextFile;
00195 struct VirtualFileEntry * ParentDirectory;
00196 deFileVirtual * OpenedFile;
00197 } VirtualFileEntry;
00198 #pragma pack(pop) //restore the packing
00199
00200
00201 deBoolean Open(deFileVirtual *BaseFile, const char *Filename, long OpenFlags);
00202
00203
00204 deBoolean Close(deFileVirtual *FileEntry);
00205
00206
00207 long Read(deFileVirtual *FileEntry, void *Buffer, long Length);
00208 long Write(deFileVirtual *FileEntry, void *Buffer, long Length);
00209
00210
00211 DWORD deFSVirtual::SetSize(deFileVirtual *FileEntry, long NewSize, deFSPROGRESS *StatusCallback);
00212
00213 private:
00214
00215 deBoolean ReadDirectoryTree();
00216 deBoolean WriteDirectoryTree();
00217 deBoolean DestroyDirectoryTree();
00218
00219
00220 DWORD AdjustFile(deFileVirtual *FileEntry,long WriteSize, deBoolean MakeCopy, deFSPROGRESS *StatusCallback);
00221 DWORD MoveData(long StartPosition, long ByteShift, deFSPROGRESS *StatusCallback);
00222
00223
00224 deBoolean MatchPattern(const char *Pattern, const char *Filename);
00225 deBoolean IsPattern(const char *Pattern);
00226
00227
00228 DWORD deFSVirtual::DeleteDirectory(const char *Directory, deFSPROGRESS *StatusCallback);
00229
00230 #define VirtualFindID 0x44494656 //'VFID', id for search handles
00231
00232
00233 typedef struct VirtualHeader
00234 {
00235 DWORD ID;
00236 DWORD Version;
00237 long DirectoryOffset;
00238 } VirtualHeader;
00239
00240
00241 typedef struct FindInfoVirtual
00242 {
00243 DWORD FindID;
00244 char * FindPattern;
00245 VirtualFileEntry * FindLastEntry;
00246 VirtualFileEntry * FindDirectory;
00247 deBoolean FindDirSearched;
00248 } FindInfoVirtual;
00249
00250
00251
00252
00253 VirtualFileEntry *ParseDirectory(const char *Directory, deBoolean FileAttached, long *FileNameStart);
00254 deBoolean NameInUse(VirtualFileEntry *Directory, const char *Name, deBoolean *IsDirectory);
00255 deBoolean AdjustFilePositions(VirtualFileEntry *Directory, long StartPosition, long ByteShift);
00256
00257
00258 IdeFSReal * BaseFS;
00259 IdeFile * BaseFile;
00260 deBoolean BaseFileOwner;
00261 long BaseFlags;
00262
00263
00264 VirtualFileEntry * RootDirectory;
00265 VirtualFileEntry * CurrentDirectory;
00266
00267
00268 char * CurDirectoryName;
00269 };
00270
00271 #endif
00272